# 1. 使用递归函数计算1到n的自然数之和
# def calcOnetoN(n):
#     if n == 0:
#         return 0
#     else:
#         return n + calcOnetoN(n - 1)
#
# print(calcOnetoN(10)) # 55
import datetime
# 2. 编写程序。如果一个n位数刚好包含了1至n中所有数字各一次，则称它是全数字。
#    要求从键盘上输入一组整数，判断它们是否是全数字

# def Alldigital(n):
#     m = n
#     count = 1 # 统计n是几位数，首先能保证n至少是一位数
#     while m >= 10: # 满足两位数进来
#         count += 1
#         m //= 10
#
#     m = n
#     digit_map = {}
#     lst=[]
#     for i in range(1, count + 1):
#         digit_map[i] = 1
#         lst.append(i)
#
#     while m:
#         k = int(m % 10)
#         if k not in lst:
#             return False
#         elif digit_map[k] == 1:
#             digit_map[k] = 0
#             m = m // 10
#         else:
#             return False
#     return True
#
# user_input = int(input("请输入数字:"))
# if Alldigital(user_input):
#     print("全数字")
# else:
#     print("不是全数字")

# 3. 递归遍历二叉树（前序、中序、后序遍历）

# class TreeNode:
#     def __init__(self, data=0, left=None, right=None):
#         self.data = data
#         self.left = left
#         self.right = right
#
#     def preorder_traversal(self):  # 前序遍历
#         if self is not None:
#             print(self.data, end=' ')  # 根
#             if self.left:  # 先判断左子树是否存在
#                 self.left.preorder_traversal()  # 左
#             if self.right:  # 再判断右子树是否存在
#                 self.right.preorder_traversal()  # 右
#
#     def inorder_traversal(self):  # 中序遍历
#         if self is not None:
#             if self.left:  # 先判断左子树是否存在
#                 self.left.inorder_traversal()  # 左
#             print(self.data, end=' ')  # 根
#             if self.right:  # 再判断右子树是否存在
#                 self.right.inorder_traversal()  # 右
#
#     def postorder_traversal(self):  # 后序遍历
#         if self is not None:
#             if self.left:  # 先判断左子树是否存在
#                 self.left.postorder_traversal()  # 左
#             if self.right:  # 再判断右子树是否存在
#                 self.right.postorder_traversal()  # 右
#             print(self.data, end=' ')  # 根
#
# root = TreeNode(1)
# root.left = TreeNode(2)
# root.right = TreeNode(3)
# root.left.left = TreeNode(4)
# root.left.right = TreeNode(5)
#
# print("前序遍历: ", end="")
# root.preorder_traversal()  # 输出: 1 2 4 5 3
# print("\n中序遍历: ", end="")
# root.inorder_traversal()  # 输出: 4 2 5 1 3
# print("\n后序遍历: ", end="")
# root.postorder_traversal() # 输出 4 5 2 3 1

# 4. 定义模块名为 mymodule.py 文件，以下所示，
# 要求在一个新的文件中导入 mymodule，然后使用 maxnum()和 minnum()函数

# import mymodule
# print()
# m= mymodule.maxnum(10, 12)
# print('测试 10 和 12 的较大值为： ',m)
# print("5 和 6 两者最小值为： {}".format(mymodule.minnum(5, 6)))

# 5.使用import语句导入模块
# import math
# print(math.pi) # math模块中的常数pi
# print(math.fmod(10, 3)) # 求余数
#
# # 可以使用as选项为导入的模块指定一个别名
# import math as m
# print(m.e)
# print(m.fabs(-10))

# 6. 使用from语句导入模块
# from random import random # random是Python内置模块
# print(random()) # random()返回0~1之间的随机小数
# from random import * # 导入random模块中的所有对象
# print(randint(10, 20)) # 返回两个整数之间的随机整数
# print(uniform(5, 10))
# from  random import  uniform as u
# print(u(5, 10))

# 7. 使用import导入模块，观察模块中变量的变化情况
# 说明: 模块文件是mymodule.py
# import mymodule
# print(mymodule.x)
# mymodule.testm()
# mymodule.x = 100
# print(mymodule.x)

# 8. 使用from语句导入模块时，模块中变量的变化情况
# from mymodule import *
# print(x) # x是模块中的变量
# x = 100
# print(x)

# 注意: 如果重新导入模块，x值还是原模块定义的值

# 9. __name__属性的测试
# from mymodule import *
# fibo1(15)
# print()
# fibo2(10)

# 10. 查看math库的函数
# import math
# print(dir(math))
# dir函数用于查看模块中所有函数列表

# 11. 查看random库中的函数
# import random
# print(dir(random))

# 12. datetime类的应用
# from datetime import datetime, date
#
# aday = datetime.now() # now方法: 返回当前日期时间
# print(aday)
#
# # 创建一个 datetime 对象
# dt = datetime(2020, 12, 18, 16, 4, 40, 988963)
# print(dt)
# print(type(dt))
#
# t1 = dt.time()
# print(t1)
# print(type(t1))
#
# print(f"当前时间是{dt.hour}:{dt.minute}:{dt.second}")

# 13. datetime对象方法和属性的应用
# from datetime import *
# dt = datetime.today() # today方法: 返回日期
# print(f"当前日期是{dt.year}年{dt.month}月{dt.day}日")
# print(dt.time()) # time方法: 获取datetime对象对应的time对象，tzinfo为None
# tup1 = dt.timetuple() # timetuple方法； 返回datetime对象对应的元祖(不包括tzinfo)
# print(tup1)
# print(f"当前日期是:{tup1.tm_year}年{tup1.tm_mon}月{tup1.tm_mday}日")
# print(dt.ctime()) # ctime方法: 返回24字符长度的时间字符串，如Thu Oct 17 21:53:52 2024
# print(dt.replace(month=3))
# # replace方法: 返回一个新的datetime对象，如所有参数都为空，则返回一个与原datetime对象相同的对象

# 14. strftime方法的应用
# strftime方法可以按用户需要来格式化输出日期和时间
# from datetime import datetime
# dt1 = datetime(2020, 12, 10, 13, 50)
# print(dt1.strftime("%Y-%m-%d"))
#
# dt2 = datetime.today()
# print(dt2.strftime("当前日期:%Y年%m月%d日, %A")) # %A本地完整的星期名称
#
# print("当前日期:{0:%Y}年{0:%m}月{0:%d}日".format(dt2))

# 15. 绘制图案为紫色正方形螺旋
# import turtle
# turtle.setup(400, 360)
# turtle.pensize(2) #设置画笔宽度为2像素
# turtle.pencolor("purple") #设置画笔颜色为紫色
# turtle.shape("turtle") #设置画笔形状为“海龟
# turtle.speed(10) #设置绘图速度为10
# a=5  #起始移动长度a为5像素
# for i in range(40): #循环 40 次
#     a = a + 6 #移动长度a每次增加6像素
#     turtle.left(90) #画笔每次移动旋转 90°
#     turtle.fd(a) #画笔向前移动a像褰
# turtle.hideturtle() #隐藏画笔
# turtle.done() # 结束绘制

# 16.心形图标的绘制
# import turtle
# def gxy(): #绘制200个点，每点turt1e方向右转1°
#     for i in range(200):
#         turtle.right(1) #调整turtle前进方向右转1°
#         turtle.forward(1)
#
# turtle.setup(400,300)
# turtle.color('red','pink')
# turtle.pensize(2)
# turtle.speed(30)
# turtle.goto(0,-100)
# turtle.begin_fill()
# turtle.left(140) #调整 turtle 前进方向左转140°
# turtle.forward(112)
# gxy()
# turtle.left(120)
# gxy()
# turtle.forward(112)
# turtle.end_fill()
# #绘制文字
# turtle.up()
# turtle.seth(180) # 调整 turtle 方向左转 180°
# turtle.fd(100)
# turtle.write("I Love Python" )
# turtle.hideturtle() # 隐藏turtle
# turtle.done() # 结束绘制

# 17. jieba库的分词应用。
# import jieba
# # 清华大学镜像源：pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
# str3="实施科教兴国战略，强化现代化建设人才支撑"
# seg_list = jieba.cut(str3)
# print(seg_list)
# for s in seg_list:print(s,end=',')
# print()
# print(jieba.lcut(str3))
# print(jieba.lcut(str3,cut_all=True))
# print(jieba.lcut_for_search(str3))

# 18. 向分词添加单词。
# import jieba
# print(jieba.lcut("斯凯温是一个优秀的外语教师"))
# print(jieba.lcut("黄土窑的未来值得人们向往"))
# jieba.add_word("黄土窑")
# print(jieba.lcut("黄土窑的未来值得人们向往"))

# 19. 基于 TF-IDF 算法的关键词抽取的示例。
# import jieba.analyse
# import jieba
# content=''' 教育、科技、人才是全面建设社会主义现代化国家的基础性、战略性支撑。必须坚挥科技
# 是第一生产力、人才是第一资源、创新是第一动力，深入实施科教兴国战略、人才强国战略。创新驱动发展战略，开
# 辟发展新领域新赛道，不断塑造发展新动能新优势。'''
# tags = jieba.analyse.extract_tags(content, topK=5)
# print(tags)


def tree_height(node):
    # 检查节点是否为空
    if node is None:
        return 0
    # 递归计算左右子树的高度
    left_height = tree_height(tree[node][0])
    right_height = tree_height(tree[node][1])
    # 返回当前节点的高度
    return 1 + max(left_height, right_height)

# 计算树的高度，从根节点1开始
height = tree_height(1)
print(f"The height of the tree is: {height}")

# 用字典表示二叉树
tree = {
    1: [2, 3],  # 节点1的左孩子是节点2，右孩子是节点3
    2: [4, 5],  # 节点2的左孩子是节点4，右孩子是节点5
    3: [6, 7],  # 节点3的左孩子是节点6，右孩子是节点7
    4: [None, None],  # 节点4是叶子节点
    5: [None, None],  # 节点5是叶子节点
    6: [None, None],  # 节点6是叶子节点
    7: [None, None]   # 节点7是叶子节点
}

tree_height(tree)
